#ifndef PRUEBAESTRATEGIAREG_H_
#define PRUEBAESTRATEGIAREG_H_

#include "Alumno.h"
#include "ClaveAlumno.h"
#include "../EstrategiaAlmacenamientoRegistros.h"
#include "../Archivo.h"

void pruebaAltaBusqueda(Toolkit::TipoSerializacion tSerializacion)
{	
	stringstream stream;
	
	//ME CAGO EN LA PUTA QUE PARIO A C++. SI, VOS STROUSTRUP.
	//SI CAMBIO ALMACENAMIENTO POR ARCHIVO ANDA.
	Toolkit::Archivo almacenamiento(50, "", "pruebaAlumnos.txt", tSerializacion, stream);
			
	Toolkit::EstrategiaAlmacenamientoRegistros estrategia(tSerializacion, 50);
		
	Toolkit::WrapperComponente wrapper(tSerializacion);
	
	Toolkit::Alumno facundo(87712, "Facundo Olano Jr.", tSerializacion);	
	estrategia.guardarDato(almacenamiento, facundo, 
			Toolkit::ClaveAlumno(facundo.getPadron(), tSerializacion), wrapper);
				
	Toolkit::Alumno dupont(55555, "Marcel Dupont", tSerializacion);
	estrategia.guardarDato(almacenamiento, dupont, 
			Toolkit::ClaveAlumno(dupont.getPadron(), tSerializacion), wrapper);	
	
	unsigned long int posArtigas;
	Toolkit::Alumno artigas(11111, "Pepe Artigas", tSerializacion);
	posArtigas = estrategia.guardarDato(almacenamiento, artigas, 
			Toolkit::ClaveAlumno(artigas.getPadron(), tSerializacion), wrapper);
	
	Toolkit::Alumno iorio(88712, "Ricardo de la Concepción Iorio", tSerializacion);
	estrategia.guardarDato(almacenamiento, iorio, 
			Toolkit::ClaveAlumno(iorio.getPadron(), tSerializacion), wrapper);
	
	Toolkit::Alumno carolo(33333, "Carolo Bazofio", tSerializacion);
	estrategia.guardarDato(almacenamiento, carolo, 
			Toolkit::ClaveAlumno(carolo.getPadron(), tSerializacion), wrapper);
	
	Toolkit::Alumno pelotudo(22222, "Juan Carlos Pelotudo", tSerializacion);
	estrategia.guardarDato(almacenamiento, pelotudo, 
			Toolkit::ClaveAlumno(pelotudo.getPadron(), tSerializacion), wrapper);
	
	Toolkit::Alumno brown(87713, "Luis Almirante Brown", tSerializacion);
	estrategia.guardarDato(almacenamiento, brown, 
			Toolkit::ClaveAlumno(brown.getPadron(), tSerializacion), wrapper);			
	
	Toolkit::Alumno aux(0, "AUXILIAR", tSerializacion);
	estrategia.recuperarDato(almacenamiento, posArtigas, aux, 
		Toolkit::ClaveAlumno(artigas.getPadron(), tSerializacion), wrapper);
	
	cout << "dato leído, nombre: " << aux.getNombre() << " padron: " 
			<< aux.getPadron() << endl;
			
	unsigned long int posAux;
	estrategia.busquedaSecuencial(almacenamiento, aux, 
		Toolkit::ClaveAlumno(iorio.getPadron(), tSerializacion), posAux, wrapper);
	
	cout << "dato leído secuencialmente, nombre: " << aux.getNombre() << " padron: " 
			<< aux.getPadron() << endl;
	
}

void pruebaAux(Toolkit::TipoSerializacion tSerializacion)
{
	stringstream stream;
	
	//ME CAGO EN LA PUTA QUE PARIO A C++. SI, VOS STROUSTRUP.
	//SI CAMBIO ALMACENAMIENTO POR ARCHIVO ANDA.
	Toolkit::Archivo almacenamiento(50, "", "pruebaAlumnos.txt", tSerializacion, stream);
			
	Toolkit::EstrategiaAlmacenamientoRegistros estrategia(tSerializacion, 50);
		
	Toolkit::WrapperComponente wrapper(tSerializacion);
	
	Toolkit::Alumno facundo(87712, "Facundo Olano Jr.", tSerializacion);	
	unsigned long int posFacundo = estrategia.guardarDato(almacenamiento, facundo, 
			Toolkit::ClaveAlumno(facundo.getPadron(), tSerializacion), wrapper);
				
	Toolkit::Alumno aux(0, "AUXILIAR", tSerializacion);
	estrategia.recuperarDato(almacenamiento, posFacundo, aux, 
		Toolkit::ClaveAlumno(facundo.getPadron(), tSerializacion), wrapper);
	
	cout << "dato leído, nombre: " << aux.getNombre() << " padron: " 
			<< aux.getPadron() << endl;
	
}

void pruebaTonta () {
	stringstream stream, s2;
	
	Toolkit::Archivo almacenamiento(80, "", "pruebaAlumnos.txt", Toolkit::BINARIO, stream);
	
	stream.str("");
	string nombre = "Facundo Olano Jr.";
	
	int tamano = nombre.size();
	stream.write((char*) &tamano, sizeof(int));
	stream.write(nombre.c_str(), tamano);
	int numero = 125;
	stream.write((char*) &numero, sizeof(int));	
	
	unsigned long int posicion = almacenamiento.guardarDato(stream);
	
	stream.str("");	
	almacenamiento.recuperarDato(posicion, stream);
		
	stream.read((char*)&tamano, sizeof(int));
		
	char* buffer = new char[tamano];
	stream.read(buffer, tamano);
	nombre = string("").append(buffer, tamano);
	stream.read((char*) &numero, sizeof(int));
	delete []buffer;
	cout << "cosas que se leen: " << tamano << endl << nombre << endl << numero << endl;
	
}


void pruebaBajasModificaciones(Toolkit::TipoSerializacion tSerializacion) 
{
	stringstream stream;
	
	Toolkit::Archivo almacenamiento(50, "", "pruebaAlumnos.txt", tSerializacion, stream);
			
	Toolkit::EstrategiaAlmacenamientoRegistros estrategia(tSerializacion, 50);
		
	Toolkit::WrapperComponente wrapper(tSerializacion);
	
	Toolkit::Alumno facundo(87712, "Facundo Olano Jr.", tSerializacion);	
	estrategia.guardarDato(almacenamiento, facundo, 
			Toolkit::ClaveAlumno(facundo.getPadron(), tSerializacion), wrapper);
				
	Toolkit::Alumno dupont(55555, "Marcel Dupont", tSerializacion);
	estrategia.guardarDato(almacenamiento, dupont, 
			Toolkit::ClaveAlumno(dupont.getPadron(), tSerializacion), wrapper);	
	
	unsigned long int posArtigas;
	Toolkit::Alumno artigas(11111, "Pepe Artigas", tSerializacion);
	posArtigas = estrategia.guardarDato(almacenamiento, artigas, 
			Toolkit::ClaveAlumno(artigas.getPadron(), tSerializacion), wrapper);
	
	unsigned long int posIorio;
	Toolkit::Alumno iorio(88712, "Ricardo de la Concepción Iorio", tSerializacion);
	posIorio = estrategia.guardarDato(almacenamiento, iorio, 
			Toolkit::ClaveAlumno(iorio.getPadron(), tSerializacion), wrapper);
	
	Toolkit::Alumno carolo(33333, "Carolo Bazofio", tSerializacion);
	estrategia.guardarDato(almacenamiento, carolo, 
			Toolkit::ClaveAlumno(carolo.getPadron(), tSerializacion), wrapper);
	
	Toolkit::Alumno pelotudo(22222, "Juan Carlos Pelotudo", tSerializacion);
	estrategia.guardarDato(almacenamiento, pelotudo, 
			Toolkit::ClaveAlumno(pelotudo.getPadron(), tSerializacion), wrapper);
	
	unsigned long int posBrown;
	Toolkit::Alumno brown(87713, "Luis Almirante Brown", tSerializacion);	
	posBrown = estrategia.guardarDato(almacenamiento, brown, 
			Toolkit::ClaveAlumno(brown.getPadron(), tSerializacion), wrapper);	
	
	//elimino un par
	Toolkit::Alumno aux(0, "AUXILIAR", tSerializacion);
	
	estrategia.eliminarDato(almacenamiento, posArtigas, aux,
			 Toolkit::ClaveAlumno(artigas.getPadron(), tSerializacion), wrapper);
	
	estrategia.eliminarDato(almacenamiento, posBrown, aux,
			 Toolkit::ClaveAlumno(brown.getPadron(), tSerializacion), wrapper);
	
	//agrego uno nuevo
	unsigned long int posDude;
	Toolkit::Alumno theDude(57712, "Jeffrey Lebowski", tSerializacion);	
	posDude = estrategia.guardarDato(almacenamiento, theDude, 
			Toolkit::ClaveAlumno(theDude.getPadron(), tSerializacion), wrapper);
	
	estrategia.recuperarDato(almacenamiento, posDude, aux, 
		Toolkit::ClaveAlumno(theDude.getPadron(), tSerializacion), wrapper);	
	cout << "dato leído, nombre: " << aux.getNombre() << " padron: " 
			<< aux.getPadron() << endl;
	
	
	//modfico uno
	Toolkit::Alumno nuevo(88712, "Ricardo del Universo Iorio", tSerializacion);
	estrategia.modificarDato(almacenamiento, nuevo, 
			Toolkit::ClaveAlumno(iorio.getPadron(), tSerializacion), posIorio, wrapper);
	
	unsigned long int posAux;
	estrategia.busquedaSecuencial(almacenamiento, aux, 
		Toolkit::ClaveAlumno(iorio.getPadron(), tSerializacion), posAux, wrapper);
	
	cout << "dato leído secuencialmente, nombre: " << aux.getNombre() << " padron: " 
			<< aux.getPadron() << endl;	
}


#endif /*PRUEBAESTRATEGIAREG_H_*/
